package com.iman.common.support;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


/**
 * 分页对象. 包含当前页数据及分页信息如�?�记录数.
 * 来自www.springside.org.cn
 *
 * @since 2007-03-30
 * @version 1.0
 */
public class Page<T> implements Serializable {
    /**
     * 持久�?.
     */
    private static final long serialVersionUID = -1L;

    /**
     * 默认分页�?.
     */
    public static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 每页的记录数.
     */
    private int pageSize = DEFAULT_PAGE_SIZE;

    /**
     * 当前页第�?条数据在List中的位置,�?0�?�?.
     */
    private long start;

    /**
     * 当前页中存放的记�?,类型�?般为List.
     */
    private List<T> data;

    /**
     * 总记录数.
     */
    private long totalCount;

    /**
     */
    public Page() {
        this(0, 0, DEFAULT_PAGE_SIZE, new ArrayList<T>());
    }

    /**
     * 默认构�?�方�?.
     *
     * @param startIn     本页数据在数据库中的起始位置
     * @param totalSizeIn 数据库中总记录条�?
     * @param pageSizeIn  本页容量
     * @param dataIn      本页包含的数�?
     */
    public Page(long startIn, long totalSizeIn, int pageSizeIn,
        List<T> dataIn) {
        pageSize = pageSizeIn;
        start = startIn;
        totalCount = totalSizeIn;
        data = dataIn;
    }
    
    public Page( long totalSizeIn,List<T> dataIn) {
        totalCount = totalSizeIn;
        data = dataIn;
    }

    /**
     * @return long 总记录数.
     */
    public long getTotalCount() {
        return totalCount;
    }

    /**
     * @return long 总页�?.
     */
    public long getTotalPageCount() {
        if ((totalCount % pageSize) == 0) {
            return totalCount / pageSize;
        } else {
            return (totalCount / pageSize) + 1;
        }
    }

    /**
     * @return int 每页记录�?.
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * @return long 当前页码，从1�?�?.
     */
    public long getCurrentPageNo() {
        return (start / pageSize) + 1;
    }

    /**
     * @return boolean 是否有下�?�?
     */
    public boolean hasNextPage() {
        return this.getCurrentPageNo() < this.getTotalPageCount();
    }

    /**
     * @return boolean 是否有上�?�?
     */
    public boolean hasPreviousPage() {
        return this.getCurrentPageNo() > 1;
    }

    /**
     * 获取任一页第�?条数据在数据集的位置，每页条数使用默认�??.
     *
     * @see #getStartOfPage(int,int)
     * @param pageNo 页码
     * @return int 第一条记录的位置
     */
    protected static int getStartOfPage(int pageNo) {
        return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
    }

    /**
     * 获取任一页第�?条数据在数据集的位置.return is 0 indexed, 
     *
     * @param pageNo   �?1�?始的页号
     * @param pageSize 每页记录条数
     * @return 该页第一条数据行号
     */
    public static int getStartOfPage(int pageNo, int pageSize) {
        return (pageNo - 1) * pageSize;
    }

    //获取当前页的�?后一条数�?,return is 0 indexed
    //@param pageNo   �?1�?始的页号
    public int getEndOfPage(int pageNo, int pageSize){
    	if(this.getTotalCount()==0)
    		return 0;
    	if(pageNo == this.getTotalPageCount()){
    		return (int)this.getTotalCount()-1;
    	}else{
    		return getStartOfPage(pageNo+1,pageSize)-1;
    	}
    }
    
	public long getStart() {
		return start;
	}

	public void setStart(long start) {
		this.start = start;
	}

	public List<T> getData() {
		return data;
	}
	
	public static void main(String[] args) {
		Page page = new Page(0,1246,900,null);
    	System.out.println(page.getTotalPageCount());
    	System.out.println(page.getEndOfPage(1, 900));
    	System.out.println(page.getEndOfPage(2, 900));
    	System.out.println(page.getStartOfPage(1, 900));
    	System.out.println(page.getStartOfPage(2, 900));
	}

	public void setData(List<T> data) {
		this.data = data;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}
}
